package com.example.utils.util.TreeNodeUtil.pojo;

import com.example.utils.util.TreeNodeUtil.utils.NaryTreeNode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

/**
 * @Description     TreeNode 树节点 （定义每一个节点的信息，即每一个节点对应一条数据信息）
 * @ClassName TreeNode
 * @Author jiang_11445266119198
 * @Date 2022/11/20 12:37
 */
@Setter
@Getter
@ToString
public class TreeNode {

    /** 节点ID */
    private Integer id;

    /** 父节点ID：顶级节点为0 */
    private Integer parentId;

    /** 节点名称 */
    private String label;

    /** 子节点 */
    private List<TreeNode> children;

    public TreeNode(Integer id, Integer parentId, String label) {
        this.id = id;
        this.parentId = parentId;
        this.label = label;
    }

    /**
     * 先序遍历：根左右
     * 利用栈模拟递归调用
     * 将根结点压入栈中，当栈不空时执行：
     * 弹出栈中结点，将其放入结果队列中
     * 将该结点的孩子按照倒序依次放入栈中
     */
    public List<TreeNode> preOrder() {
        Stack<TreeNode> stack = new Stack<>();
        LinkedList<TreeNode> pre = new LinkedList<>();
        if (this == null) return pre;
        stack.add(this);
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            pre.add(node);
            //pre.add(node.val);
            Stack<TreeNode> reChildren = new Stack<>();
            reChildren.addAll(node.children);
            while (!reChildren.isEmpty()) {
                stack.push(reChildren.pop());
            }

        }
        return pre;
    }


}
